package org.example.testcode.leet_code;

/**
 * 位运算
 */
public class BitOperation {


    /**
     * 打印一个数字的二进制
     *
     * @param num
     */
    public static void print(int num) {
        for (int i = 31; i >= 0; i--) {
            System.out.print((num & (1 << i)) == 0 ? "0" : "1");
        }
        System.out.println();
    }


    public static void main(String[] args) {

        //32位，第一位是符号位，“0”代表正数，“1”代表负数，取值范围是-2^31 ~ 2^31-1
        System.out.println("打印32位");
        int num = 4;
        print(num);

        System.out.println("取反");
        int a = 5;
        print(a);
        int b = -a;
        print(b);

        System.out.println("最小数：Integer.MIN_VALUE=" + Integer.MIN_VALUE);
        int min = Integer.MIN_VALUE;
        print(min);
        print(-min);

        //左移，不涉及符号位
        print(a << 1);

        System.out.println("右移，需要区分有符号位： “>>”带符号位右移，正数补“0”，负数补“1”； “>>>”不带符号位右移");
        //右移，需要区分有符号位： “>>”带符号位右移，正数补“0”，负数补“1”； “>>>”不带符号位右移
        //  >> 带符号位右移，正数补“0”，负数补“1”
        print(5 >> 1);
        print(-5 >> 1);

        //  >>>  不带符号位右移
        print(5 >>> 1);
        print(-5 >>> 1);


    }

}
